package vf2.so;

/************************************************************************
  			VF2_SO_BFTServidor.java

    BattleField Tactics Online - A Strategy RPG Online Game
    Copyright (C) 2008  
	Douglas Ribeiro, Kely Marques Rosa, Rodrigo da Fonseca Lacerda

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

	Contact: douglas666@gmail.com
 **************************************************************************/


import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.*;

import vf1.so.VF1_SO_IClienteRMI;
import vf2.rn.*;
import vf2.ip.*;

/**
 * Class VF2_SO_BFTServidor
 */
public class VF2_SO_BFTServidor { // Douglas - essa classe precisa ser singleton para usar o RMI -> verificar se é condizente com o MA ou se depois deverá ser alterado algo

	//
	// Fields
	//

	private static HashMap<String, VF2_RN_Jogador> jogadores = new HashMap<String, VF2_RN_Jogador>(); //adicionado ): -> lista de jogadores

	private static final VF2_SO_BFTServidor servidor = new VF2_SO_BFTServidor(); //Douglas - Singleton!
	private VF2_SO_ServidorRMI servidorRMI;
	private String ip;
	private VF2_RN_Espera espera = new VF2_RN_Espera();  

	//
	// Constructors
	//

	private VF2_SO_BFTServidor () { 
		try {
			setServidorRMI(new VF2_SO_ServidorRMI());
		}catch (java.rmi.RemoteException ex) {

		}

	};

	//
	// Methods
	//

	//
	// Accessor methods
	//

	private void setIp ( String newVar ) {
		ip = newVar;
	}

	private String getIp ( ) {
		return ip;
	}

	//
	// Other methods
	//

	public void conectarJogador( String usuario, String ip)
	{
		//MA: Faz a conexao do jogador por RMI;

		VF2_RN_Jogador jogador = new VF2_RN_Jogador(); //Douglas - Algo assim, espero
		jogador.setNome(usuario); //Douglas - Algo assim, espero
		jogador.setIp(ip); //mudou um metodo de acesso para publico, sera q pode?
		//isso talvez tenha q mudar para funcionar com varios clientes direito 
		getJogadores().put(ip, jogador);
		getEspera().inserirNaListaEspera(jogador);
		getEspera().enviarLista();
	}


	public void desconectarJogador( String usuario )
	{
		//MA: desconecta o Jogador por RMI; 
	}


	public boolean iniciarServidor(  ) throws UnknownHostException, MalformedURLException, RemoteException //Douglas - Alterado void  para boolean (RMI)
	{
		/* MA: 
	     this.setEspera(new VF2_RN_Espera());
	     Imprime num console: "Servidor de Battle Field Tactics Online iniciado";
		 */

		return getServidorRMI().iniciarServidorRMI();
	}


	public boolean encerrarServidor(  )  //Douglas - Alterado void  para boolean (RMI)
	{
		/*MA
	    	desconecta todos os clientes por RMI;
	    	encerra servidor;
		 */

		boolean error = getServidorRMI().finalizarServidorRMI();
		setServidorRMI(null);
		return error;
	}


	public static VF2_SO_BFTServidor getServidor() {
		return servidor;
	}

	public VF2_SO_ServidorRMI getServidorRMI() {
		return servidorRMI;
	}

	public void setServidorRMI(VF2_SO_ServidorRMI servidorRMI) {
		this.servidorRMI = servidorRMI;
	}

	public VF2_RN_Espera getEspera() {
		return espera;
	}

	public void setEspera(VF2_RN_Espera espera) {
		this.espera = espera;
	}

	protected static HashMap<String, VF2_RN_Jogador> getJogadores() {
		return jogadores;
	}

	protected static void setJogadores(HashMap<String, VF2_RN_Jogador> jogadores) {
		VF2_SO_BFTServidor.jogadores = jogadores;
	}


}
